<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>构造函数</title>
</head>
<body>
<script>
    /* 构造函数的 函数名首字母大些 跟普通函数类似
    *       执行流程:
    *               1.立即创建一个新的对象
    *               2.将新建的对象设置为函数中的this
    *               3.逐行执行函数的代码
    *               4.将新建的对象作为返回值返回
    *       使用同一个构造函数创建的对象，我们成为一类对象，也将一个构造函数称为一类
    *       我们将构造函数创建的对象，成为该类的实例
    *       我们用instaceof(实例) 检查一个对象事都是一个类的实例
    *       语法:
    *           对象 instanceof 构造函数(类 )
    *           如果是 返回true 如果不是 false
    *         所有的对象都是Object的后代 即Object是老祖宗
    *
    *   创建一个Person构造函数 为每一个对象都添加了一个sayName方法，是在构造函数内部创建的，即构造函数每执行一次就会创建一个
    *       sayName方法，具有唯一性
    * */
    function Person(name,age,gender) {
        this.name=name;
        this.age=age;
        this.gender=gender;
        // this.sayName=fun;//可以不写了
    }
    //函数直接写在全局作用域里会污染全局作用域的命名空间，而且定义里面很不安全 需要用到原型对象 向它里面添加一个方法
    //向Person的原型对象中添加sayName方法
    Person.prototype.sayName=function () {
        alert("hello 大家好我是--"+this.name);
    };//sayName方法放在全局作用域里 这样提高性能 不用每次执行就创建一个新的sayName方法了
    function Dog() {

    }
    var per=new Person("孙悟空",18,"男");//构造函数的调用
    var per1=new Person("玉兔",22,"女");
    var per2=new Person("公鸡精",20,"男");
    var dog=new Dog();
    console.log(per);
    console.log(per1);
    console.log(per2);
    console.log(per instanceof Person);//true
    console.log(dog instanceof Dog);//true 检查dog是否是Dog的实例 如果是就返回true
    console.log(dog instanceof Person);//false dog不是Person的实例 返回false

    console.log(dog instanceof Object);//true
    console.log(per instanceof Object);//true

    per.sayName();
    per1.sayName();
    console.log(per.sayName==per1.sayName);//true 如果fun新建这个函数没放在全局作用域里 返回值是false
</script>
</body>
</html>